home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / presto / prest_04.lha / src / spinlock.h < prev    next >
C/C++ Source or Header  |  1989-08-08  |  2KB  |  96 lines

  1. //
  2. // Spinlocks should be used when the caller expects to need to touch
  3. // a piece of data for only a very short time.  Interference on that
  4. // data will cause the later thread to spin (his processor does not
  5. // become available!)
  6. //
  7. //    USE WITH CAUTION
  8. //
  9. //
  10.  
  11. //
  12. // If compiling presto kernel, or compiling with preemption 
  13. // included, then include code to make threads not preemptable
  14. // inside spinlock.  Else, omit for speed.
  15. //
  16.  
  17. #define DO_SPINLOCK_INLINE
  18.  
  19. #ifdef DO_SPINLOCK_INLINE
  20. #define SPINLOCK_INLINE     inline
  21. #else
  22. #define SPINLOCK_INLINE
  23. #endif
  24.  
  25. #ifdef sequent
  26. #include "parallel.h"
  27. #endif sequent
  28. #ifdef sun
  29. #include "parallel.h"
  30. #endif sun
  31.  
  32. #ifdef vax 
  33. typedef    int slock_t;
  34. #define L_UNLOCKED 0
  35.  
  36. #define S_LOCK s_lock
  37. #define S_UNLOCK s_unlock
  38.  
  39. //
  40. // For the vax, the underlying lock functions are in vax_lock.s and
  41. // spinlock.c.  The s_lock and s_unlock functions do not return a
  42. // meaningful result.
  43. //
  44. #endif vax
  45. #ifdef sun
  46. #define S_LOCK s_lock
  47. #endif sun
  48.  
  49. extern void s_init_lock(slock_t*);
  50. extern void s_lock(slock_t*);
  51. extern void s_unlock(slock_t*);
  52. extern int s_clock(slock_t*);
  53.  
  54. class Thread;
  55.  
  56. class Spinlock    : public Object  {    
  57.     slock_t        sl_lock;
  58. public:
  59.     Spinlock()
  60.         { s_init_lock(&sl_lock); }
  61.     SPINLOCK_INLINE ~Spinlock();
  62.  
  63.     //
  64.     // Acquire lock, spinning until it is free.
  65.     //
  66.     SPINLOCK_INLINE void lock();
  67.  
  68.     //
  69.     // Acquire lock and return true iff lock is free, else return
  70.     // false immediately without spinning.
  71.     //
  72.     int trylock()
  73.         { return  s_clock(&sl_lock); }
  74.  
  75.     //
  76.     // Old name for trylock().
  77.     //
  78.     int checklock()
  79.         { return  s_clock(&sl_lock); }
  80.  
  81.     //
  82.     // Return true iff locked, else false.
  83.     //
  84.     int testlock()
  85.         { return  sl_lock; }
  86.  
  87.     //
  88.     // Release lock.
  89.     //
  90.     SPINLOCK_INLINE void unlock();
  91.     virtual void print(ostream& = cout);
  92. };
  93.      
  94.  
  95.  
  96.